/*
 * @Author: Chen Zoe
 * @Email: czh.zero@qq.com
 * @Date: 2025-03-04 10:28:57
 * @Description: ...
 */

#ifndef __CONTROLLER_H
#define __CONTROLLER_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdlib.h>
#include "esp_log.h"
#include "esp_err.h"
#include "driver/gpio.h"

#include "lvgl.h"



// 选择控制设备类型
// 编码器 LV_INDEV_TYPE_ENCODER  4
// 按键组 LV_INDEV_TYPE_KEYPAD   2
// 触摸屏 LV_INDEV_TYPE_POINTER  1
#define CONTROLLER_DEVICE_TYPE  1


// 旋转编码器作为输入设备
#if CONTROLLER_DEVICE_TYPE == 4
    #include "lib/rotary_encoder.h"
    #define ENCODER_A_PUL_PIN   1
    #define ENCODER_B_PUL_PIN   2
    #define ENCODER_ENTER_PIN   0
    #define LVGL_INDEV_TYPE     LV_INDEV_TYPE_ENCODER   // 无需变动

// 按键组作为输入设备
#elif CONTROLLER_DEVICE_TYPE == 2
    #define BUTTON_ENTER_PIN    0
    #define BUTTON_LEFT_PIN     1
    #define BUTTON_RIGHT_PIN    2
    #define LVGL_INDEV_TYPE     LV_INDEV_TYPE_ENCODER

// 触摸屏作为输入设备
#elif CONTROLLER_DEVICE_TYPE == 1
    #include "lib/esp_lcd_touch_ft5x06.h"
    #include "driver/i2c.h"
    #include "lcd_st7789.h"     // 为了与屏幕参数对齐
    #define POINTER_CLK_PIN     4
    #define POINTER_SDA_PIN     15
    #define POINTER_INT_PIN     16      // 中断引脚（没有配置为-1）
    #define POINTER_RST_PIN     17      // 重置引脚（没有配置为-1）
    #define LVGL_INDEV_TYPE     LV_INDEV_TYPE_POINTER
#endif



/**
 * @brief 输入设备硬件接口初始化
 * @return {esp_err_t}
 */
esp_err_t input_device_init(void);


/**
 * @brief lvgl的控制设备扫描回调函数, 传递给 lv_disp_drv_t类型实例的 flush_cb接口
 */
void indev_read_cb(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t * data);



#ifdef __cplusplus
}
#endif

#endif
